package com.lcz.study_designmode.动态代理;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * <pre>
 * <img width="128" height="110" src="https://tse3-mm.cn.bing.net/th/id/OIP-C.en-w_oH-yn2UsSRfWnOsGAHaGY?w=198&h=180&c=7&r=0&o=5&dpr=1.25&pid=1.7" alt="马刺">
 * 作者:     <a href="https://github.com/liuchuanzheng">刘传政</a>
 * 创建时间:  15:53 2022/5/13 0013
 * QQ:      1052374416
 * 电话:     18501231486
 * 描述:
 * </pre>
 */
public class ProxyFactory {
    //被代理的类
    private TrainStation trainStation = new TrainStation();

    public ISell getProxyObject() {
        //通过jdk的动态代理技术,运行时动态生成一个代理对象.就跟我们手写了一个代理类一回事.只不过我们省事了
        //jdk的动态代理只代理接口方法.所以必须有接口
        //还有一种cjlib的动态代理技术.不需要有接口.代理任何方法.相当于生成了一个子类.
        ISell iSell = (ISell) Proxy.newProxyInstance(trainStation.getClass().getClassLoader(), trainStation.getClass().getInterfaces(), new InvocationHandler() {
            /**
             *
             * @param proxy 生成的代理对象
             * @param method 调用的方法
             * @param args  调用方法的参数
             * @return 方法的返回值
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("invoke执行");
                System.out.println("代售点收取一定的费用");
                method.invoke(trainStation, args);//执行真实方法
                return null;
            }
        });
        return iSell;
    }
}
